package com.hmdp.controller;


import cn.hutool.core.util.RandomUtil;
import com.hmdp.dto.LoginFormDTO;
import com.hmdp.dto.Result;
import com.hmdp.entity.User;
import com.hmdp.entity.UserInfo;
import com.hmdp.service.IUserInfoService;
import com.hmdp.service.IUserService;
import com.hmdp.utils.RedisConstants;
import com.hmdp.utils.RegexUtils;
import com.hmdp.utils.UserHolder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.DispatcherServlet;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.concurrent.TimeUnit;


@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
    @Resource
    private IUserService userService;

    @Resource
    private IUserInfoService userInfoService;
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    /**
     * 发送手机验证码
     * 其中HttpSession和HttpServletRequest、HttpServletResponse、ServletInputStream、Writer / OutputStream
     * 都是原生的servlet对象，SpringMVC会自动注入，这里HttpSession表示当前会话对象从request.getSession()中得到
     */
    @PostMapping("code")
    public Result sendCode(@RequestParam("phone") String phone, HttpSession session) {
        log.info("保存验证码,传入的电话为{}",phone);
        return userService.sendCode(phone,session);

    }

    /**
     * 登录功能
     * @param loginForm 登录参数，包含手机号、验证码；或者手机号、密码
     */
    @PostMapping("/login")
    public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session){
        log.info("完成登录用户信息{}",loginForm);
        return userService.login(loginForm);
    }

    /**
     * 基于Session的登出功能
     * @return 无
     */
//    @PostMapping("/logout")
//    public Result logout(HttpSession session){
//        log.info("完成登出用户信息{}",session);
//        session.invalidate();
//        return Result.ok();
//    }

    /**
     * 基于Token的登出功能
     * @return 无
     */
    @PostMapping("/logout")
    public Result logout(HttpServletRequest request){
        log.info("完成登出用户信息");
        String token = request.getHeader("authorization");
        stringRedisTemplate.expire(RedisConstants.LOGIN_USER_KEY+token,0, TimeUnit.SECONDS);
        return Result.ok();
    }

    @GetMapping("/me")
    public Result me(){
        log.info("当前用户返回给前端");
        return Result.ok(UserHolder.getUser());
    }

    @GetMapping("/info/{id}")
    public Result info(@PathVariable("id") Long userId){
        // 查询详情
        UserInfo info = userInfoService.getById(userId);
        if (info == null) {
            // 没有详情，应该是第一次查看详情
            return Result.ok();
        }
        info.setCreateTime(null);
        info.setUpdateTime(null);
        // 返回
        return Result.ok(info);
    }
}
